perm filename INITER[NS,SYS]1 blob
sn#102482 filedate 1974-05-22 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00007 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 Definitions. The file DEFS must be assembled with this file.
C00003 00003 storage allocations
C00004 00004 INITER
C00009 00005 WORD
C00013 00006 SORT
C00015 00007 GETCH FINISH NOLOOK NOENTR NOCORE
C00017 ENDMK
C⊗;
;Definitions. The file DEFS must be assembled with this file.
IFNDEF DEBUG <DEBUG←1>
TITLE INITER -- creater of INI.DAT file from WORDS.TXT
F←0
A←1
B←2
C←3 ;current character
D←4
E←5 ;counter and temporary AC
L←6
M←7
N←10
Q←11 ;byte pointer
R←12 ;temporary byte pointer
W←13 ;W:Z are used as LOOKUP and ENTER block
X←14
Y←15
Z←16
P←17 ;pdl pointer
;I/O channels
TI ←←0 ;text input from WORDS.TXT file
DAT←←1 ;output to INI.DAT file
LF←←12 FF←←14
; storage allocations
IFN DEBUG <
LSYM←←2000
SYM: BLOCK LSYM
>;END IFN DEBUG
DSK17: 17
SIXBIT /DSK/
0
DATCMD: IOWD 1,DATA ;dump mode command for writing INI.DAT goes here
0
NTIBUF←←2
TIBUF: BLOCK 203*NTIBUF;buffer space for reading in WORDS.TXT
IBUF: BLOCK 3 ;buffer header for reading WORDS.TXT
LPDL←←30
PDL: BLOCK LPDL ;pushdown list
DIFILE: SIXBIT /WORDS/
SIXBIT /NON/
0↔0
DOFILE: SIXBIT /INI/
SIXBIT /DAT/
277000,,0
0
;INITER
INITER: RESET
MOVE P,[IOWD LPDL,PDL]
INIT TI,0 ;CHANNEL FOR INPUT OF WORDS.TXT
SIXBIT /DSK/
IBUF
HALT .
OPEN DAT,DSK17 ;CHANNEL FOR OUTPUT OF INI.DAT
HALT .
MOVE A,[DIFILE,,W]
BLT A,Z
LOOKUP TI,W
JRST NOLOOK
MOVE A,[DOFILE,,W]
BLT A,Z
ENTER DAT,W
JRST NOENTR
MOVEI A,TIBUF
MOVEM A,JOBFF↑
INBUF TI,NTIBUF ;SET UP INPUT BUFFER RING
IFN DEBUG,<
HRLZ W,JOBSYM↑ ;GET PTR TO SYMBOL TABLE
CAMN W,[SYM,,0] ;HAS IT BEEN MOVED?
JRST NOMOVE ;YES
HRRI W,SYM ;ADDRESS OF NEW LOC FOR SYMBOL TABLE
HRRM W,JOBSYM ;NEW PTR TO SYMBOL TABLE
HLRE X,JOBSYM ;GET LENGTH OF SYMBOL TABLE
MOVN X,X ;POSITIVE LENGTH
CAILE X,LSYM
HALT . ;SYMBOL TABLE TOO BIG
ADDI X,-1(W) ;ADDRESS OF LAST WORD
BLT W,(X) ;MOVE TABLE
NOMOVE:
>;END DEBUG
PUSHJ P,GETREC ;INPUT FILE MUST BE IN E/TV FORMAT
CAIE C,FF
JRST .-2
;WORD
SETZM DATA ;NO STORIES YET
MOVE A,[3,,3]
MOVEM A,DATA+1 ;PTR TO FIRST, LAST AND ONLY DICT ENTRY FOR NOW
MOVEI E,6
MOVSM E,DATA+2 ;PTR TO FIRST FREE WORDS IN .DAT FILE, .TXT FILE
MOVE A,[1,,1]
MOVEM A,DATA+3 ;DICT ENTRY PTRS FORWARD AND BACK
MOVE A,[377777,,-1]
MOVEM A,DATA+4 ;TEXT OF SINGLE WORD IN DICT
MOVSI A,-1
MOVEM A,DATA+5 ;MARK IT AS A NON-WORD
SETZM DATA(E)
MOVEI A,DATA+1(E)
HRLI A,-1(A)
BLT A,@JOBREL ;CLEAR CORE FOR .DAT FILE
WORD: PUSHJ P,GETCH ;get char from input file
CAIL C,"A" ;look for beginning of a word--do we have a letter?
CAILE C,"Z"
JRST WORD ;no
MOVEI A,DATA+20(E) ;MAKE SURE ENOUGH ROOM TO ADD NEW ENTRY TO DICT
CAMG A,JOBREL↑ ;ENOUGH CORE?
JRST COREOK ;YES
CORE A, ;NO, GET ENOUGH
JRST NOCORE ;OOPS!
SETZM DATA(E)
MOVEI A,DATA+1(E)
HRLI A,-1(A)
BLT A,@JOBREL ;CLEAR NEW CORE
COREOK:
MOVE R,[POINT 5,DATA+1(E)] ;byte ptr for depositing text into .DAT file
WORD3: IDPB C,R
PUSHJ P,GETCH ;get next char
CAIL C,"A" ;is it a letter?
CAILE C,"Z"
JRST WORD4 ;NO
JRST WORD3 ;yes--here we go loop de loop
WORD4: PUSHJ P,GETCH
CAIE C,LF ;SKIP TO LF
JRST WORD4
MOVEI A,1
IORM A,@R ;TURN ON LOW ORDER BIT TO MARK END OF TEXT OF WORD
;SORT
MOVEI C,1 ;ptr to dict list header
SORT1: MOVE D,C ;D points to prev dict word
HRRZ C,DATA(D) ;C points to next dict word
MOVEI A,1(E) ;get ptr to text of new word
MOVEI B,1(C) ;get ptr to text of old word
SORT2: MOVE M,DATA(A) ;get a word of text of new word
CAMLE M,DATA(B) ;and compare against corresponding part of old word
JRST SORT1 ;move on down keyword list
CAME M,DATA(B)
JRST SORT4 ;insert right here in list
TRNN M,1 ;keywords equal so far--at end of keyword?
AOJA A,[AOJA B,SORT2];no--get next part of each keyword
OUTSTR [ASCIZ /DUPLICATE /]
JRST WORD ;discard entry for new word
SORT4: HRLI C,(D) ;make forward/backward ptr for new dict entry
MOVEM C,DATA(E) ; and place into entry
HRRM E,DATA(D) ;make prev entry point to new one
HRLM E,DATA(C) ;make next entry point back to new one
ADDI E,2-DATA(R) ;advance free .DAT ptr beyond new entry
MOVSI A,-1
MOVEM A,DATA-1(E) ;make new entry a non-word
JRST WORD ;get next word from input file
;GETCH FINISH NOLOOK NOENTR NOCORE
GETCH: SOSG IBUF+2
GETREC: IN TI,
JRST GETCH1
STATZ TI,20000
JRST FINISH
OUTSTR [ASCIZ /INPUT FILE ERROR./]
HALT .
GETCH1: ILDB C,IBUF+1
JUMPE C,GETCH
POPJ P,
FINISH: HRLM E,DATA+2 ;STORE PTR TO FIRST FREE WORD IN .DAT FILE
MOVNI E,1(E)
HRLM E,DATCMD ;SET UP OUTPUT DUMP MODE COMMAND
OUT DAT,DATCMD ;WRITE OUT FILE
JRST FINIS1
OUTSTR [ASCIZ /OUTPUT FILE ERROR./]
HALT .
FINIS1: RELEAS DAT,
RELEAS TI,
EXIT
NOCORE: OUTSTR [ASCIZ/FAILED TO GET ENOUGH CORE.
/]
HALT .
NOLOOK: OUTSTR [ASCIZ/LOOKUP FAILED -- /]
HRRZ X,X ;GET ERROR CODE
CAILE X,MAXERR
MOVEI X,MAXERR
OUTSTR @FERROR(X)
OUTSTR [ASCIZ/.
/]
HALT .
NOENTR: OUTSTR [ASCIZ/ENTER FAILED -- /]
HRRZ X,X ;GET ERROR CODE
CAILE X,MAXERR
MOVEI X,MAXERR
OUTSTR @FERROR(X)
OUTSTR [ASCIZ/.
/]
HALT .
FERROR: [ASCIZ/NO SUCH FILE/]
[ASCIZ/ILLEGAL PPN/]
[ASCIZ/PROTECTION VIOLATION/]
[ASCIZ/FILE BUSY/]
MAXERR←←.-FERROR
[ASCIZ/BAD RETRIEVAL OR OTHER HORRIBLE ERROR/]
LIT
VAR
DATA: BLOCK 10
END INITER